package com.bjsxt;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**HashMap 容器类
 * HashMap 是 map 接口的接口实现类，它采用哈希算法实现，是Map接口最常用的
 * 实现类，由于底层采用了哈希表存储数据，所以要求 键 不能重复，如果发生重复，新的值会
 * 替换旧的值，HashMap在查找、删除、修改方面都有非常高的效率*/
public class HashMapTest {
    public static void main(String[] args) {
        //实例化HashMap容器, 用Map接口
        Map<String,String> map = new HashMap<>();
        //添加元素
        map.put("b","B");
        String value = map.put("a","A");
        //添加成功返回空
        System.out.println(value);//null

        //key相同时，value被替换  返回被替换的值
        String value1 = map.put("b","BB");
        System.out.println(value1);//B

        System.out.println("-----获取元素方式一------");
        //通过get给key,获取value
        //缺点：1，要知道key，才可以获得value 2，如果元素比较多，调用次数多，不方便
        // 优点：知道key时，获取value比较方便
        String val = map.get("a");
        System.out.println(val);//A
        System.out.println("-------获取元素方式二-------");
        map.put("c","C");
        map.put("d","D");
        map.put("e","E");
        //获取HashMap容器中所有的元素，可以使用keySet方法与get方法一并完成
        //把key元素放入Set集合中
        Set<String> set = map.keySet();
        for (String key:set){
            String v1 =map.get(key);
            System.out.println(key +"-----"+v1);
          //  System.out.println(key+"--------"+map.get(key));
        }
        System.out.println("-----获取元素方式三-----");
        //通过entrySet 方法获取Map.Entry类型获取元素
        //Map中所有映射,  （k,v）为一对映射
        //创建存放Map entry 类型的Set  映射放入Set容器中
        Set<Map.Entry<String,String>> entrySet = map.entrySet();
        //遍历 entrySet 得到Map entry 类型的对象(元素)
        // 通过对象调用getValue getKey
        for(Map.Entry<String,String> entry:entrySet){
            //逐个获取
            String key = entry.getKey();
            String value2 = entry.getValue();
            System.out.println(key+"-------"+value2);
        }
        System.out.println("---并集---");
        //void putAll(Map m)
        Map<String,String> map1 = new HashMap<>();
        //添加元素
        map1.put("a","A");
        map1.put("b","B");
        map1.put("c","C");

        Map<String,String> map2 = new HashMap<>();
        map2.put("d","A");
        map2.put("e","E");
        map2.put("c","CV");
        //注意：key不同，value可以相同。
        // key相同时，当前容器中的value会被并过来的value覆盖掉
        map1.putAll(map2);//map2并入map1
        //将key值放入set容器中
        Set<String> set1 = map1.keySet();
        //遍历key
        for (String key1:set1){
            //得到每一个key 对应的value值
            String val2 = map1.get(key1);
            System.out.println(key1+"-----"+val2);
        }
        System.out.println("----删除元素----");
        /*V remove(Object key)*/
        String val3 = map1.remove("e");
        System.out.println(val3);//返回被删除的value值
        //遍历
        Set<String> set2 = map1.keySet();
        for(String key2:set2){
           /* String val03 = map1.get(key2);
            System.out.println(key2+"-----"+val03);*/
            System.out.println(key2+"-----"+map1.get(key2));
        }
        System.out.println("------判断key是否存在-----");
        boolean key1 = map1.containsKey("c");
        System.out.println(key1);

        System.out.println("-----判断value是否存在------");
        boolean value2  = map1.containsValue("A");
        System.out.println(value2);//true
        boolean value3 = map1.containsValue("Aa");
        System.out.println(value3);//false

    }
}
